#pragma once

#include <memory>
#include <unordered_map>
#include <mutex>
#include <atomic>
#include "network/tcp_session.hpp"

/**
 * @brief 连接管理器类
 * 
 * 负责管理所有的TCP会话连接，提供连接的添加、删除、查找等功能
 * 使用线程安全的方式管理连接
 */
class ConnectionManager {
public:
    /**
     * @brief 获取单例实例
     * @return ConnectionManager的单例实例
     */
    static ConnectionManager& get_instance();

    /**
     * @brief 添加新的连接
     * @param session TCP会话对象
     * @return 分配的会话ID
     */
    uint32_t add_connection(std::shared_ptr<TcpSession> session);

    /**
     * @brief 移除连接
     * @param session_id 会话ID
     */
    void remove_connection(uint32_t session_id);

    /**
     * @brief 获取连接
     * @param session_id 会话ID
     * @return TCP会话对象的智能指针，如果不存在返回nullptr
     */
    std::shared_ptr<TcpSession> get_connection(uint32_t session_id);

    /**
     * @brief 获取当前连接数
     * @return 当前活跃的连接数
     */
    size_t get_connection_count() const;

    /**
     * @brief 广播消息给所有连接
     * @param data 要广播的数据
     */
    void broadcast_message(const std::vector<uint8_t>& data);

private:
    ConnectionManager() = default;  // 私有构造函数
    ~ConnectionManager() = default;

    // 禁止拷贝和赋值
    ConnectionManager(const ConnectionManager&) = delete;
    ConnectionManager& operator=(const ConnectionManager&) = delete;

    /**
     * @brief 生成唯一的会话ID
     * @return 新的会话ID
     */
    uint32_t generate_session_id();

    std::unordered_map<uint32_t, std::shared_ptr<TcpSession>> sessions_;  ///< 会话映射表
    mutable std::mutex mutex_;  ///< 互斥锁，保护会话映射表
    std::atomic<uint32_t> next_session_id_{1};  ///< 下一个可用的会话ID
}; 